SRC_DIR := src
OBJ_DIR := obj
INCLUDE_DIR := include

# 生成文件路径
GEN_SRC := $(SRC_DIR)/lex.yy.c $(SRC_DIR)/y.tab.c
GEN_HEADER := $(SRC_DIR)/y.tab.h

# 所有对象文件，添加 logger.o 和 response.o
OBJ := $(OBJ_DIR)/y.tab.o $(OBJ_DIR)/lex.yy.o \
       $(OBJ_DIR)/parse.o $(OBJ_DIR)/example.o \
       $(OBJ_DIR)/liso_server.o $(OBJ_DIR)/liso_client.o \
       $(OBJ_DIR)/logger.o $(OBJ_DIR)/response.o  # 新增 logger.o 和 response.o

BIN := example liso_server liso_client

CC := gcc
CPPFLAGS := -I$(INCLUDE_DIR) -I$(SRC_DIR)  # 增加对 src 的搜索
CFLAGS := -g -Wall
YFLAGS := -d  # yacc 生成头文件

.PHONY: all clean

all: $(BIN)

# 主目标依赖，更新 liso_server 依赖，添加 logger.o 和 response.o
example: $(OBJ_DIR)/example.o $(OBJ_DIR)/parse.o $(OBJ_DIR)/y.tab.o $(OBJ_DIR)/lex.yy.o
	$(CC) $^ -o $@

liso_server: $(OBJ_DIR)/liso_server.o $(OBJ_DIR)/parse.o $(OBJ_DIR)/y.tab.o $(OBJ_DIR)/lex.yy.o $(OBJ_DIR)/logger.o $(OBJ_DIR)/response.o  # 新增 logger.o 和 response.o
	$(CC) $^ -o $@

liso_client: $(OBJ_DIR)/liso_client.o
	$(CC) $^ -o $@

# 生成语法分析器
$(SRC_DIR)/lex.yy.c: $(SRC_DIR)/lexer.l
	flex -o $@ $<

$(SRC_DIR)/y.tab.c $(SRC_DIR)/y.tab.h: $(SRC_DIR)/parser.y
	yacc $(YFLAGS) -o $(SRC_DIR)/y.tab.c $<

# 通用编译规则
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
	$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

# 特殊依赖声明
$(OBJ_DIR)/parse.o: $(INCLUDE_DIR)/parse.h $(SRC_DIR)/y.tab.h
$(OBJ_DIR)/example.o: $(INCLUDE_DIR)/parse.h $(SRC_DIR)/y.tab.h

# 创建对象目录
$(OBJ_DIR):
	mkdir -p $@

# 扩展 clean 目标以删除 .log 文件
clean:
	rm -rf $(BIN) $(OBJ_DIR) $(GEN_SRC) $(GEN_HEADER) *.log